package cn.js.sangu.unitStore.service;

import java.util.Objects;

import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.js.sangu.unitStore.common.exception.ServiceException;
import cn.js.sangu.unitStore.entity.ProcessNodeTemplate;
import cn.js.sangu.unitStore.mapper.ProcessNodeTemplateMapper;
import cn.js.sangu.unitStore.utils.TokenUtils;
import lombok.extern.slf4j.Slf4j;

/**
 * 流程节点模板服务实现类
 * 提供流程节点模板的CRUD操作和业务逻辑处理
 */
@Slf4j
@Service
public class ProcessNodeTemplateService extends ServiceImpl<ProcessNodeTemplateMapper, ProcessNodeTemplate> {

    /**
     * 保存流程节点模板信息
     * @param dto 流程节点模板数据传输对象
     * @return 保存后的流程节点模板
     * @throws ServiceException 当保存失败时抛出
     */
    public ProcessNodeTemplate saveInfo(ProcessNodeTemplate dto) {
        try {
            Assert.notNull(dto, "模板数据不能为空");
            Assert.hasText(dto.getTemplateName(), "模板名称不能为空");

            // 设置创建人和修改人
            dto.setUserId(Objects.requireNonNull(TokenUtils.getCurrentUser()).getId());
            dto.setModifier(Objects.requireNonNull(TokenUtils.getCurrentUser()).getId());

            if (!super.save(dto)) {
                throw new ServiceException("保存失败！请联系管理员");
            }
            log.info("保存模板成功，模板名称: {}", dto.getTemplateName());
            return dto;
        } catch (IllegalArgumentException e) {
            throw new ServiceException(e.getMessage());
        } catch (ServiceException e) {
            log.error("保存模板失败: {}", e.getMessage());
            throw e;
        } catch (Exception e) {
            log.error("保存模板异常", e);
            throw new ServiceException("保存失败！请联系管理员");
        }
    }

    /**
     * 更新流程节点模板信息
     * @param param 流程节点模板参数
     * @return 更新后的流程节点模板
     * @throws ServiceException 当更新失败时抛出
     */
    public ProcessNodeTemplate updateInfo(ProcessNodeTemplate param) {
        try {
            Assert.notNull(param, "模板数据不能为空");
            Assert.notNull(param.getId(), "模板ID不能为空");
            Assert.hasText(param.getTemplateName(), "模板名称不能为空");

            // 设置修改人
            param.setModifier(Objects.requireNonNull(TokenUtils.getCurrentUser()).getId());

            if (!super.updateById(param)) {
                throw new ServiceException("更新失败！请联系管理员");
            }
            log.info("更新模板成功，模板ID: {}", param.getId());
            return param;
        } catch (IllegalArgumentException e) {
            throw new ServiceException(e.getMessage());
        } catch (ServiceException e) {
            log.error("更新模板失败: {}", e.getMessage());
            throw e;
        } catch (Exception e) {
            log.error("更新模板异常", e);
            throw new ServiceException("更新失败！请联系管理员");
        }
    }
}